Laboratorium 6 - część 1/2

W pakiecie OpenCV wszystkie zadania związane z detekcją i opisem punktów kluczowych realizowane są przez zestaw specjalnych klas, dla których bazową jest cv::Feature2D. Jedną z wielu pochodnych tej klasy jest interesująca nas na zajęciach cv::SIFT, z której dokumentacją należy się zapoznać.
Najważniejsze, co trzeba wiedzieć:

  1. do konstrukcji obiektu SIFT służy metoda cv2.SIFT_create - to do niej przekazujemy parametry detektora (w dokumentacji występuje jako cv::SIFT::create);
  2. obsługujemy detektor przez interfejs cv::Feature2D, konkretnie metody detect do detekcji punktów kluczowych oraz compute do obliczania ich deskryptorów (opcjonalnie detectAndCompute).

Schemat użycia:

sift_instance = cv2.SIFT_create()
# 'image' powinno być obrazem jednokanałowym (jeśli nie, zostanie zastosowane cvtColor z flagą COLOR_BGR2GRAY)
keypoints = sift_instance.detect(image)
keypoints, descriptors = sift_instance.compute(image, keypoints)

keypoints jest listą obiektów specjalnego typu cv2.KeyPoint, która jest modyfikowana przez SIFT::compute!
descriptors jest natomiast macierzą float32 o wymiarach NxK, gdzie N jest liczbą punktów kluczowych, a K jest liczbą obliczonych cech.

Warto również zapoznać się z funkcją cv2.drawKeypoints w kontekście prezentacji wyników. Zwróć uwagę na flagi sterujące rysowaniem - szczególnie użyteczna jest cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS.

Zadanie 1

Przetestuj wpływ podstawowych parametrów detektora SIFT (contrastThreshold i edgeThreshold) na uzyskiwane punkty kluczowe (liczność, lokalizacja, rozmiar), korzystając z obrazów cells i lena. Pamiętaj że ich działanie jest odwrotne (tzn. jeden odsiewa cechy "mniejsze niż", a drugi "większe niż").

Zadanie 2

Detektor SIFT jest w teorii niezmienniczy względem translacji, rotacji czy zmiany skali. Przetestuj te własności w praktyce, oceniając wizualnie stabilność punktów wykrywanych na obróconej i przeskalowanej wersji obrazów cells i lena.